home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / DCLAP 4j / DClap / DClipboard.cpp < prev    next >
Encoding:
Text File  |  1995-12-17  |  6.3 KB  |  319 lines  |  [TEXT/R*ch]

  1. // UClipboard.cp 
  2.  
  3.  
  4. #include "DClipboard.h"
  5. #include <dgg.h>
  6. #include <DWindow.h>
  7. #include <DPanel.h>
  8. #include <DTaskMaster.h>
  9. #include <DApplication.h>
  10. #include <DViewCentral.h>
  11.  
  12. #ifdef WIN_MAC
  13.     // undef some conflicts b/n Types.h && NlmTypes
  14. #undef Handle
  15. #undef true
  16. #undef false
  17. //#undef Boolean
  18. #include <Scrap.h>
  19. //#define Boolean  Nlm_Boolean
  20. #endif
  21.  
  22.  
  23. DClipboardMgr* gClipboardMgr = NULL;             
  24.  
  25.  
  26. class DInitClipboard {
  27. public:
  28.     DInitClipboard()     { gClipboardMgr = new DClipboardMgr(); }  
  29. };
  30.  
  31. DInitClipboard globalInit; // do init now
  32.  
  33.  
  34.  
  35.  
  36. // class DClipboardMgr
  37.  
  38.  
  39. DClipboardMgr::DClipboardMgr() : DTaskMaster(0)
  40. {
  41.     fClipView = NULL;
  42.     fClipOrphan= NULL;
  43.     fClipWindow = NULL;
  44.     fGotClipType = FALSE;
  45.     fOldScrapStuff= NULL;
  46.     fNewScrapStuff= NULL;
  47.     gClipboardMgr = this;
  48.     fPrefClipType = Str2Idtype("TEXT"); // kPICT, ...
  49.     
  50. #ifdef WIN_MAC
  51.     fOldScrapStuff= MemNew(sizeof(ScrapStuff));
  52.     fNewScrapStuff= MemNew(sizeof(ScrapStuff));
  53. #endif
  54.  
  55.  
  56. void DClipboardMgr::AboutToLoseControl(Boolean convertClipboard)
  57. {
  58.     if (convertClipboard) {
  59.         if (fClipView && !fClipWrittenToSystem) {
  60. #ifdef WIN_MAC
  61.             long err = ZeroScrap();
  62. #endif
  63. #if FIX
  64.              fClipView->WriteToSystemClipboard();  //WriteToDeskScrap
  65. #endif
  66.              fClipWrittenToSystem = TRUE;
  67.             this->LoadSystemClip();
  68.         }
  69.     }
  70. }  
  71.  
  72.  
  73. void DClipboardMgr::LoadSystemClip()
  74. {
  75. #ifdef WIN_MAC
  76.     ScrapStuff* newscrap = InfoScrap();
  77.     MemCpy( fOldScrapStuff, fNewScrapStuff, sizeof(ScrapStuff));
  78.     MemCpy( fNewScrapStuff, newscrap, sizeof(ScrapStuff));
  79. #endif 
  80. }  
  81.  
  82.  
  83.  
  84. void DClipboardMgr::CheckSystemClip()
  85. {
  86.     this->LoadSystemClip();
  87. #ifdef WIN_MAC
  88.     if (((ScrapStuff*)fOldScrapStuff)->scrapCount 
  89.      != ((ScrapStuff*)fNewScrapStuff)->scrapCount) {
  90. #if FIX
  91.         fClipView->FreeFromClipboard();         
  92. #endif
  93.         fClipView = NULL;     
  94.         this->ReadFromSystem();
  95.     }
  96. #endif
  97. }  
  98.  
  99.  
  100.  
  101. long DClipboardMgr::GetDataToPaste(char* data, ulong datalen, long& clipKind)
  102. {
  103.     long length= 0;
  104.     if (fGotClipType) {
  105.         clipKind = fPrefClipType;
  106. #if FIX
  107.         length = fClipView->GivePasteData(data, datalen, clipKind);
  108. #endif
  109.         if (length < 0) ; //Failure((OSErr)length, 0);
  110.         }
  111.     else 
  112.         length = -1;
  113.     return length;
  114. }  
  115.  
  116.  
  117.  
  118.  
  119. void DClipboardMgr::Launch()
  120. {
  121.     // Create the clip window and default view 
  122.     fClipWindow = this->MakeClipboardWindow();
  123.     DView* aview= fClipWindow->FindSubview(kIDClipView);
  124.     if (aview) fClipOrphan = aview;
  125.  
  126.     // Add the clipboard manager as an application behavior
  127.     //gApplication->AddBehavior(this);
  128.  
  129.     this->LoadSystemClip();
  130.     this->ReadFromSystem();
  131.  
  132.  
  133.  
  134. class DClipView : public DNotePanel {
  135. public:
  136.     short fTestFlag;
  137.     DClipView( DWindow* aWindow) :
  138.         DNotePanel( DClipboardMgr::kIDClipView, aWindow, "Clip view"),
  139.         fTestFlag(0)
  140.         {}
  141.     virtual ~DClipView();
  142. };
  143.  
  144. class DClipWindow : public DWindow {
  145. public:
  146.   short  fTestShort;
  147.     DClipWindow() :
  148.      DWindow( DClipboardMgr::kIDClipView+1, NULL, DWindow::document, -5, -5, -50, -20, "Clipboard"),
  149.      fTestShort(0)
  150.      {}
  151.     virtual ~DClipWindow();
  152. };
  153.  
  154. DClipWindow::~DClipWindow()
  155. {
  156.     if (fTestShort) ; // debugger stop point... do we get here !?
  157. }
  158.  
  159. DClipView::~DClipView()
  160. {
  161.     if (fTestFlag) ; // debugger stop point... do we get here !?
  162. }
  163.  
  164. DWindow* DClipboardMgr::MakeClipboardWindow()
  165. {
  166.     DClipWindow* aWindow= new DClipWindow(); 
  167.     if (!fClipOrphan) fClipOrphan= new DClipView( aWindow);
  168.     fClipView = fClipOrphan;
  169.     return aWindow;
  170.  
  171.  
  172. void DClipboardMgr::ReadFromSystem()
  173. {
  174.     DView* aViewForClipboard = this->MakeViewForAlienClipboard();
  175.     this->SetClipView(aViewForClipboard);
  176.     fClipWrittenToSystem = TRUE;     
  177. }  
  178.  
  179.  
  180. DView* DClipboardMgr::MakeViewForAlienClipboard()
  181. {
  182.     DView * aView = NULL;
  183.     //aView= gApplication->MakeViewForAlienClipboard();
  184.     if (!aView) aView = fClipOrphan;
  185.     return aView;
  186. }  
  187.  
  188. void DClipboardMgr::RegainControl(Boolean checkClipboard)
  189. {
  190.     if (checkClipboard) this->CheckSystemClip();
  191. }  
  192.  
  193.  
  194. void DClipboardMgr::SetClipView(DView* clipView)
  195. {
  196.     if (fClipWindow && clipView != fClipView) {
  197.         // get the old clip window scroller if possible
  198.         DView * theSuperView;
  199.         Boolean haveview;
  200.         theSuperView = fClipWindow;
  201.             
  202.             // throw out any views contained in the scroller (or window)
  203.         haveview= false;
  204.         if (theSuperView->fSubordinates) {
  205.             short i, n= theSuperView->fSubordinates->GetSize();
  206.             //for (i=0; i<n; i++) 
  207.             for (i=n-1; i>=0; i--) {
  208.                 DView* subview= (DView*) theSuperView->fSubordinates->At(i);
  209.                 //?? if (fClipWindow->IsVisible()) subview->Close();
  210.                 haveview= (subview == clipView); 
  211.                 Boolean dodelete= (!haveview && subview != fClipOrphan);
  212. #if 1
  213.                 if (subview) {
  214.                     theSuperView->RemoveSubview(subview, false);
  215.                     if (dodelete) {
  216.                  //mswin is failing here at times
  217.                         if (subview->fSubordinates) subview->DeleteSubviews();
  218.                         delete subview; subview= NULL;
  219.                         // RemoveSubview == theSuperView->fSubordinates->AtDelete(i);
  220.                         }
  221.                     }
  222. #else
  223.                 theSuperView->RemoveSubview(subview, dodelete);
  224. #endif
  225.                 }
  226.             }
  227.         
  228.             // pop in the new clipview
  229.         if (clipView) {
  230.             if (!haveview) theSuperView->AddSubordinate(clipView);
  231.             clipView->SetSuperior(theSuperView->GetNlmObject()); 
  232.             clipView->Invalidate();
  233.             clipView->Disable();     
  234.             fClipWrittenToSystem = (clipView == fClipOrphan);
  235.             }
  236.         }
  237.     fClipView = clipView;
  238.  
  239.  
  240. void DClipboardMgr::DoSetupMenus()
  241. {
  242.     gViewCentral->EnableView(DApplication::kShowClipboard);
  243. }  
  244.  
  245.  
  246. void DClipboardMgr::CanPaste(long clipKind)
  247. {
  248. #if FIX
  249.     if (fClipView && !fGotClipType)
  250.         if (fClipView->ContainsClipType(clipKind)) {
  251.             fGotClipType = TRUE;
  252.             fPrefClipType = clipKind;
  253.             }
  254. #endif
  255.     if (fGotClipType)
  256.         gViewCentral->EnableView(DApplication::kPaste);
  257.     else
  258.         gViewCentral->DisableView(DApplication::kPaste);
  259. }  
  260.  
  261.  
  262. Boolean DClipboardMgr::DoMenuTask(long tasknum, DTask* theTask)
  263. {
  264.     switch (tasknum) {
  265.     
  266.         case DApplication::kShowClipboard:
  267. #if 0
  268.             if (fClipWindow == gWindowManager->CurrentWindow())
  269.                 fClipWindow->Close(); //CloseAndFree();     
  270.             else {
  271.                 fClipWindow->Open();
  272.                 fClipWindow->Select();
  273.                 }
  274. #endif
  275.             return true;
  276.             
  277.         default:
  278.             return DTaskMaster::DoMenuTask(tasknum, theTask);
  279.             break;
  280.     }
  281.  
  282.  
  283. Boolean DClipboardMgr::IsMyAction(DTaskMaster* action)
  284. {
  285.     switch (action->Id()) {
  286.         case DApplication::kShowClipboard:
  287.             return DoMenuTask(action->Id(), NULL);
  288.         default:
  289.             return DTaskMaster::IsMyAction(action);
  290.         }
  291. }
  292.  
  293.  
  294. void DClipboardMgr::Close()
  295. {
  296. #ifdef WIN_MAC    
  297.     LoadScrap();
  298. #endif
  299.  
  300.  
  301. short DClipboardMgr::PutToSystem(char* data, ulong datasize, long clipKind)
  302. {
  303.     long err= -1;
  304.  
  305. #ifdef WIN_MAC    
  306.     err = PutScrap( datasize, clipKind, data);
  307. #endif
  308.     return err;
  309.  
  310.  
  311.  
  312.